package com.macro.mall.commission.service;

import com.github.pagehelper.Page;
import com.macro.mall.commission.domain.OrderPredicate;
import com.macro.mall.commission.entity.OrderPredicateEntity;
import com.macro.mall.commission.service.bo.InsertOrderPredicateInput;
import com.macro.mall.commission.service.bo.PagedQueryOrderPredicateInput;
import com.macro.mall.commission.service.bo.UpdateOrderPredicateInput;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 订单佣金预估Service
 *
 * @author xuyanjun
 * @date 2019-12-11
 */
public interface OrderPredicateService {

    /**
     * 预估
     *
     * @param orderId 订单id
     */
    void predict(long orderId);

    /**
     * 新增订单佣金预估
     *
     * @param input input
     * @return 新增id
     */
    long insert(InsertOrderPredicateInput input);

    /**
     * 修改订单佣金预估
     *
     * @param input input
     */
    void update(UpdateOrderPredicateInput input);

    void updateBatch(List<OrderPredicateEntity> predicateEntities);

    /**
     * 根据订单id修改已结算状态
     *
     * @param orderId 订单id
     */
    void updateSettledByOrderId(long orderId);

    /**
     * 删除订单佣金预估
     *
     * @param id id
     */
    void delete(long id);

    /**
     * 根据Id获取订单佣金预估
     *
     * @param id id
     * @return 订单佣金预估
     */
    OrderPredicateEntity getById(long id);

    /**
     * 根据批量Id获取订单佣金预估
     *
     * @param batchIds 批量ids
     * @return 订单佣金预估集合
     */
    List<OrderPredicateEntity> listByBatchIds(List<Long> batchIds);

    /**
     * 根据批量Id获取订单佣金预估
     *
     * @param batchIds 批量ids
     * @return 订单佣金预估集合
     */
    List<OrderPredicateEntity> listByOrderId(Long orderId);

    /**
     * 根据创建时间获取用户预估总和
     *
     * @param userId    用户id
     * @param beginTime 开始时间
     * @param endTime   结束时间
     * @return 结算总和
     */
    long sumAmountByCreateTimeOfUser(long userId, LocalDateTime beginTime, LocalDateTime endTime);

    /**
     * 分页查询
     *
     * @param input input
     * @return 分页的订单佣金预估
     */
    Page<OrderPredicateEntity> pagedQuery(PagedQueryOrderPredicateInput input);

    /**
     * 将实体对象转换成domain对象
     *
     * @param orderPredicateEntity 实体
     * @return orderPredicate
     */
    OrderPredicate entityToDomain(OrderPredicateEntity orderPredicateEntity);

    /**
     * 将实体对象转换成domain对象
     *
     * @param orderPredicateEntities 实体
     * @return orderPredicates
     */
    List<OrderPredicate> entityToDomain(List<OrderPredicateEntity> orderPredicateEntities);

}